package main

import (
	"fmt"
	"sort"
	"sync"
	"time"
)

/*
						Go 并发
------------------------------------------------------------------------
Go 语言支持并发，我们只需要通过 go 关键字来开启 goroutine 即可。

goroutine 是轻量级线程，goroutine 的调度是由 Golang 运行时进行管理的。

goroutine 语法格式：

go 函数名( 参数列表 )

Go 允许使用 go 语句开启一个新的运行期线程， 即 goroutine，以一个不同的、新创建的 goroutine 来执行一个函数。 同一个程序中的所有 goroutine 共享同一个地址空间。
*/
func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

//并发
func demo1() {
	var lock sync.Mutex
	var x int32 = 0
	for i = 0; i < 10000; i++ {
		go func() {
			lock.Lock()
			defer lock.Unlock()
			x++
		}()
	}

	time.Sleep(100 * time.Millisecond)
	fmt.Println(x)
}

//并发slice
func demo2() {
	var lock sync.Mutex
	var s = make([]int, 0, 1024)
	for i := 0; i < 1000; i++ {
		var x = i
		go func() {
			lock.Lock()
			defer lock.Unlock()
			s = append(s, x)
		}()

	}
	sort.Slice(s, func(i, j int) bool {
		return s[i] < s[j]
	})
	fmt.Println(s)
	fmt.Println(len(s))

}
func main28() {
	go say("world")
	say("hello")
}
